package entidades;

import util.*;
import java.util.Map;
import java.util.Date;
import java.util.List;
import java.util.HashMap;
import java.util.LinkedList;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.google.gson.Gson;
import java.util.ArrayList;

/**
 * @author JFM
 */
public class OrdenVenta extends Entidad
	{
	private String identificador;
	private int estadoId;
	private int tipoPapelId;
	private int logotipoId;
	private int manijaId;
	private int lacaUvId;
	private int lineaId;
	private int paisId;
	private boolean interior;
	private boolean barniz;
	private int cantidadColores;
	private int altaUsuarioId;
	private Date altaFechaHora;

	private EstadoVenta estado;
	private TipoPapel tipoPapel;
	private Logotipo logotipo;
	private Manija manija;
	private LacaUv lacaUv;
	private Linea linea;
	private Usuario altaUsuario;
	private Pais pais;
        private int cuerpos;
        private List<OrdenTrabajo> ordenes = new ArrayList<OrdenTrabajo>();


        private boolean llevaUV;
	
	static final String NOMBRE_TABLA = "ordenes_venta";
	
	// --- Constructores --- //

	public OrdenVenta()
		{
		identificador = "";
		estadoId = 0;
		tipoPapelId = 0;
		logotipoId = 0;
		manijaId = 0;
		lacaUvId = 0;
		lineaId = 0;
		interior = false;
		barniz = false;
		cantidadColores = 0;
		altaUsuarioId = 0;
		altaFechaHora = null;
		paisId = Pais.ARGENTINA;
		
		estado = null;
		tipoPapel = null;
		logotipo = null;
		manija = null;
		lacaUv = null;
		linea = null;
		altaUsuario = null;
		pais = null;
		}

	public OrdenVenta(int id) throws SQLException
		{ super(id); }

	public OrdenVenta(String id) throws SQLException
		{ super(id); }

	public OrdenVenta(ResultSet result) throws SQLException
		{ super(result); }

	public OrdenVenta(ResultSet result, String prefix) throws SQLException
		{ super(result, prefix); }



	// --- Metodos get()/set() --- //

	public String getIdentificador()
		{ return (identificador != null)? identificador : ""; }
	public void setIdentificador(String identificador)
		{ this.identificador = (identificador != null)? identificador : ""; }


	public boolean isInterior()
		{ return interior; }
	public void setInterior(boolean interior)
		{ this.interior = interior; }
	public void setInterior(String interior)
		{ this.interior = interior != null && ( interior.compareTo("1") == 0 || interior.compareTo("true") == 0); }

	public boolean isBarniz()
		{ return barniz; }
	public void setBarniz(boolean barniz)
		{ this.barniz = barniz; }
	public void setBarniz(String barniz)
		{ this.barniz = barniz != null && ( barniz.compareTo("1") == 0 || barniz.compareTo("true") == 0); }

	public int getCantidadColores()
		{ return cantidadColores; }
	public void setCantidadColores(int cantidadColores)
		{ this.cantidadColores = cantidadColores; }
	public void setCantidadColores(String cantidadColores)
		{ try{ this.cantidadColores = Integer.parseInt(cantidadColores); }catch(Exception e) {} }

	public int getManijaId()
		{ return manijaId; }
	public void setManijaId(int manijaId)
		{ this.manijaId = manijaId; }
	public void setManijaId(String manijaId)
		{ try{ this.manijaId = Integer.parseInt(manijaId); }catch(Exception e) {} }


	public void setManija(Manija manija)
		{ this.manija = manija; }
	public Manija getManija() throws SQLException
		{
		if(manija == null || manijaId != manija.getId())
			{ manija = new Manija(manijaId); }
		return manija;
		}

	public int getLineaId()
		{ return lineaId; }
	public void setLineaId(int lineaId)
		{ this.lineaId = lineaId; }
	public void setLineaId(String lineaId)
		{ try{ this.lineaId = Integer.parseInt(lineaId); }catch(Exception e) {} }

	public void setLinea(Linea linea)
		{ this.linea = linea; }
	public Linea getLinea() throws SQLException
		{
		if(linea == null || lineaId != linea.getId())
			{ linea = new Linea(lineaId); }
		return linea;
		}

	public int getTipoPapelId()
		{ return tipoPapelId; }
	public void setTipoPapelId(int tipoPapelId)
		{ this.tipoPapelId = tipoPapelId; }
	public void setTipoPapelId(String tipoPapelId)
		{ try{ this.tipoPapelId = Integer.parseInt(tipoPapelId); }catch(Exception e) {} }

	public void setTipoPapel(TipoPapel tipoPapel)
		{ this.tipoPapel = tipoPapel; }
	public TipoPapel getTipoPapel() throws SQLException
		{
		if(tipoPapel == null || tipoPapelId != tipoPapel.getId())
			{ tipoPapel = new TipoPapel(tipoPapelId); }
		return tipoPapel;
		}

	public int getLogotipoId()
		{ return logotipoId; }
	public void setLogotipoId(int logotipoId)
		{ this.logotipoId = logotipoId; }
	public void setLogotipoId(String logotipoId)
		{ try{ this.logotipoId = Integer.parseInt(logotipoId); }catch(Exception e) {} }

	public void setLogotipo(Logotipo logotipo)
		{ this.logotipo = logotipo; }
	public Logotipo getLogotipo() throws SQLException
		{
		if(logotipo == null || logotipoId != logotipo.getId())
			{ logotipo = new Logotipo(logotipoId); }
		return logotipo;
		}

	public int getLacaUvId()
		{ return lacaUvId; }
	public void setLacaUvId(int lacaUvId)
		{ this.lacaUvId = lacaUvId; }
	public void setLacaUvId(String lacaUvId)
		{ try{ this.lacaUvId = Integer.parseInt(lacaUvId); }catch(Exception e) {} }

	public void setLacaUv(LacaUv lacaUv)
		{ this.lacaUv = lacaUv; }
	public LacaUv getLacaUv() throws SQLException
		{
		if(lacaUv == null || lacaUvId != lacaUv.getId())
			{ lacaUv = new LacaUv(lacaUvId); }
		return lacaUv;
		}
	
	public void setAltaFechaHora(Date altaFechaHora)
		{ this.altaFechaHora = altaFechaHora; }
	public void setAltaFechaHora(String altaFechaHora)
		{ this.altaFechaHora = Util.parseDatetime(altaFechaHora); }
	public Date getAltaFechaHora() throws SQLException
		{ return altaFechaHora; }
	public String getAltaFechaHoraToString() throws SQLException
		{ return Util.format(altaFechaHora, "dd/MM/yyyy"); }

	public int getEstadoId()
		{ return estadoId; }
	public void setEstadoId(int estadoId)
		{ this.estadoId = estadoId; }
	public void setEstadoId(String estadoId)
		{ try{ this.estadoId = Integer.parseInt(estadoId); }catch(Exception e) {} }

	public void setEstado(EstadoVenta estado)
		{ this.estado = estado; }
	public EstadoVenta getEstado() throws SQLException
		{
		if(estado == null || estadoId != estado.getId())
			{ estado = new EstadoVenta(estadoId); }
		return estado;
		}

	public int getPaisId()
		{ return paisId; }
	public void setPaisId(int paisId)
		{ this.paisId = paisId; }
        public List<OrdenTrabajo> getOrdenes()
		{ return ordenes; }
	public void setOrdenes(List<OrdenTrabajo> ordenes)
		{ this.ordenes = ordenes; }
	public void setPaisId(String paisId)
		{ try{ this.paisId = Integer.parseInt(paisId); }catch(Exception e) {}; }

	public void setPais(Pais pais)
		{ this.pais = pais; }
	public Pais getPais() throws SQLException
		{
		if(pais == null || paisId != pais.getId())
			{ pais = new Pais(paisId); }
		return pais;
		}

	public int getAltaUsuarioId()
		{ return altaUsuarioId; }
	public void setAltaUsuarioId(int altaUsuarioId)
		{ this.altaUsuarioId = altaUsuarioId; }
	public void setAltaUsuarioId(String altaUsuarioId)
		{ try{ this.altaUsuarioId = Integer.parseInt(altaUsuarioId); }catch(Exception e) {} }

	public void setAltaUsuario(Usuario altaUsuario)
		{ this.altaUsuario = altaUsuario; }
	public Usuario getAltaUsuario() throws SQLException
		{
		if(altaUsuario == null || altaUsuarioId != altaUsuario.getId())
			{ altaUsuario = new Usuario(altaUsuarioId); }
		return altaUsuario;
		}

	@Override
	public String getDescriptor()
		{ return identificador; }

	@Override
	public String toJson()
		{
		HashMap map = new HashMap();
		map.put("id", id);
		map.put("identificador", identificador);
		map.put("estado_id", estadoId);
		map.put("tipo_papel_id", tipoPapelId);
		map.put("logotipo_id", logotipoId);
		map.put("manija_id", manijaId);
		map.put("lava_uv_id", lacaUvId);
		map.put("linea_id", lineaId);
		map.put("interior", interior);
		map.put("barniz", barniz);
		map.put("cantidad_colores", cantidadColores);
		map.put("alta_usuario_id", altaUsuarioId);
		map.put("alta_fecha_hora", Util.format(altaFechaHora, "dd/MM/yyyy HH:mm:ss"));
		map.put("pais_id", paisId);
	
		try{
			map.put("estado", getEstado().getDescripcion());
			map.put("tipo_papel", getTipoPapel().getDescripcion());
			map.put("logotipo", getLogotipo().getDescriptor());
			map.put("fantasia", getLogotipo().isFantasia());
			map.put("manija", getManija().getDescripcion());
			map.put("laca_uv", getLacaUv().getDescripcion());
			map.put("linea", getLinea().getDescripcion());
			map.put("alta_usuario", getAltaUsuario().getDescriptor());
			}catch(SQLException e) {}

		return new Gson().toJson(map);
		}



	// --- Metodos MySQL --- //

	@Override
	public String getNombreTabla()
		{ return NOMBRE_TABLA; }

	@Override
	public void leer(ResultSet result, String prefijo) throws SQLException
		{
		setId(result.getInt(prefijo + "id"));
		setIdentificador(result.getString(prefijo + "identificador"));
		setEstadoId(result.getInt(prefijo + "estado_id"));
		setTipoPapelId(result.getString(prefijo + "tipo_papel_id"));
		setLogotipoId(result.getInt(prefijo + "logotipo_id"));
		setManijaId(result.getInt(prefijo + "manija_id"));
		setLacaUvId(result.getInt(prefijo + "laca_uv_id"));
		setLineaId(result.getInt(prefijo + "linea_id"));
		setPaisId(result.getInt(prefijo + "pais_id"));
		setInterior(result.getBoolean(prefijo + "interior"));
		setBarniz(result.getBoolean(prefijo + "barniz"));
		setCantidadColores(result.getInt(prefijo + "cantidad_colores"));
		setAltaUsuarioId(result.getInt(prefijo + "alta_usuario_id"));
		setAltaFechaHora(result.getTimestamp(prefijo + "alta_fecha_hora"));
		}

	@Override
	public void guardar() throws SQLException
		{
		ResultSet result = MySQL.executeQuery("Call OrdenesVenta_Save(" +
				MySQL.formatId(id) + "," +
				MySQL.format(identificador) + "," +
				MySQL.formatId(estadoId) + "," +
				MySQL.formatId(lineaId) + "," +
				MySQL.formatId(logotipoId) + "," +
				MySQL.formatId(tipoPapelId) + "," +
				MySQL.formatId(manijaId) + "," +
				MySQL.formatId(lacaUvId) + "," +
				MySQL.formatId(paisId) + "," +
				MySQL.formatBit(interior) + "," +
				MySQL.formatBit(barniz) + "," +
				MySQL.format(cantidadColores) + "," +
				MySQL.formatId(altaUsuarioId) + "," +
				MySQL.format(altaFechaHora) +  ")");

		if(result.next())
			{
			if( result.getMetaData().getColumnCount() == 1)
				{
				String msj = result.getString("mensaje");
				throw new SQLException(msj);
				}
			else
				leer(result);
			}

		result.getStatement().close();
		}

	public static void borrar(String id) throws SQLException
		{
		String msj = null;
		ResultSet result = MySQL.executeQuery("Call OrdenesVenta_Delete("+id+")");
		if(result.next())
			{ msj = result.getString("mensaje"); }
		result.getStatement().close();
		if(msj != null && msj.compareToIgnoreCase("ok") != 0)
			{ throw new SQLException(msj); }
		}
	
	public List<OrdenTrabajo> getOrdenesTrabajo() throws Exception
		{ return OrdenTrabajo.listarOrdenVenta(id); }

	public static List<OrdenVenta> listar() throws SQLException
		{ return (List) Entidad.listar(OrdenVenta.class, NOMBRE_TABLA, "alta_fecha_hora ASC"); }


	public static List<OrdenVenta> listar(String ids[]) throws SQLException
		{
		if(ids != null && ids.length > 0)
			{
			int c=0;
			String where = "";
			for(int i=0; i<ids.length; i++)
				{
				if(ids[i] != null && ids[i].length() != 0)
					{
					if(c!=0) where += " OR ";
					where += "id = " + ids[i];
					c++;
					}
				}
			if(where.length() == 0) where = "true";
			return OrdenVentaView.buscar(where);
			}
		else
			{ return new LinkedList(); }
		}
	
	public static List<OrdenVenta> buscar(Map<Integer, Boolean> estados, int usuarioId, Date fechaAlta1, Date fechaAlta2) throws SQLException
		{ return buscar(estados, usuarioId, fechaAlta1, fechaAlta2, 0); } 
	
	public static List<OrdenVenta> buscar(Map<Integer, Boolean> estados, int usuarioId, Date fechaAlta1, Date fechaAlta2, int paisId) throws SQLException
		{
		String where = "TRUE";
		if(estados != null)
			{
			where += " AND ( FALSE ";
			List<EstadoVenta> est = EstadoVenta.listar();
			for(int i=0; i<est.size(); i++)
				{
				if(estados.get(est.get(i).getId()) != null && estados.get(est.get(i).getId()) == true)
					{ where += " OR estado_id = " + est.get(i).getId(); }
				}
			where += " )";
			}
		if(usuarioId > 0) where += " AND alta_usuario_id = " + usuarioId;
		if(fechaAlta1 != null) where += " AND alta_fecha_hora >= " + MySQL.formatDateMin(fechaAlta1);
		if(fechaAlta2 != null) where += " AND alta_fecha_hora <= " + MySQL.formatDateMax(fechaAlta2);
		if(paisId > 0) where += " AND pais_id = " + paisId;
		
		return OrdenVentaView.buscar(where);
		}
	
	public static OrdenVenta buscar(String salesOrder) throws SQLException
		{
		OrdenVenta ov = new OrdenVenta();
		
		ResultSet result = MySQL.executeQuery("SELECT * FROM " + NOMBRE_TABLA + " WHERE identificador = " + MySQL.format(salesOrder));
		if(result.next()) { ov.leer(result); }
		result.getStatement().close();
		
		return ov;
		}

        public int getCuerpos()
		{
                cuerpos = this.getCantidadColores() + (this.isBarniz()? 1 : 0);
                return cuerpos;
                }
	public void setCuerpos(int cuerpos)
		{ this.cuerpos = cuerpos; }

         public boolean isLlevaUV()
		{
                llevaUV = this.getLacaUvId() == LacaUv.TOTAL;
                return llevaUV;
                }
	public void setLlevaUV(boolean llevaUV)
		{ this.llevaUV = llevaUV; }

        public static String getLastFantasia() throws SQLException{
            String query = "select ov.identificador from ordenes_venta ov ";
            query +=  "where identificador LIKE 'F%' order by identificador DESC LIMIT 1 ";
            ResultSet result = MySQL.executeQuery(query);
            String idFantasia = "";
            while(result.next())
				{
                                  idFantasia = result.getString(1);
				}
            String face = "";
            try{
                String[] chars = idFantasia.split("F");

                String[] chars2 = chars[1].split("0");

                String last = chars2[chars2.length - 1];

                int f = Integer.parseInt(last) + 1;

                String ceros = "";

                for (int i = 0; i < 5 - last.length(); i++) {
                    ceros += "0";

                }
            
            face = "F" + ceros +  String.valueOf(f);
            } catch(Exception e){
                return "";
            }

            return face;
        }

}

